package question2;

import question1.PilePleineException;
import question1.PileVideException;

import java.util.Stack;

public class Pile2 implements PileI, Cloneable{
	
	/** par delegation : utilisation de la class Stack */
	private Stack<Object> stk;

	/** la capacite de la pile */
	private int capacite = 0;

	/** Creation d'une pile.
	 * @param taille la taille de la pile, la taille doit etre > 0
	 */
	public Pile2(int taille){
		if (taille<=0) this.capacite = CAPACITE_PAR_DEFAUT;
		else this.capacite = taille;
		this.stk = new Stack<Object>();
	}

	// constructeur fourni
	public Pile2(){
		this(0);
	}


	public void empiler(Object o) throws PilePleineException{
		if (estPleine()) throw new PilePleineException();
		stk.push(o);
	}


	public Object depiler() throws PileVideException{
		if (estVide()) throw new PileVideException();
		return stk.pop();
	}


	public Object sommet() throws PileVideException{
		if (estVide()) throw new PileVideException();
		return stk.peek();
	}

	/** Effectue un test de l'etat de la pile.
	 * @return vrai si la pile est vide, faux autrement
	 */
	public boolean estVide(){
		return stk.empty();
	}

	/** Effectue un test de l'etat de la pile.
	 * @return vrai si la pile est pleine, faux autrement
	 */   
	public boolean estPleine(){
		return stk.size() == this.capacite;
	}

	/** Retourne une representation en String d'une pile, 
	 * contenant la representation en String de chaque element.
	 * @return une representation en String d'une pile
	 */ 
	public String toString(){
		StringBuffer s = new StringBuffer();
		s.append("[");
		for (int i=stk.size()-1;i>=0;i--) {
		      s.append(stk.elementAt(i).toString());
		      if (i >0) s.append(", ");
		    }
		s.append("]");
		return s.toString();
	}

	public boolean equals(Object o){
		return  (Pile2)o != null && PileI.class.isInstance(o) && stk.size() == ((Pile2)o).stk.size() && stk.equals(((Pile2)o).stk);
	}

	// fonction fournie
	public int hashCode(){
		return toString().hashCode();
	}

	// fonction fournie
	public Object clone() throws CloneNotSupportedException{
		Pile2 p = new Pile2(this.capacite());
		p.stk = (Stack<Object>)stk.clone();
		return p;
	}

	/** Retourne le nombre d'element d'une pile.
	 * @return le nombre d'element present
	 */ 
	public int taille(){
		return stk.size();
	}

	/** Retourne la capacite de cette pile.
	 * @return le nombre d'element possible
	 */ 
	public int capacite(){
		return this.capacite;
	}

} // Pile2.java
